#include <cstdlib>
#include "rejilla.h"


Rejilla::Rejilla(){
	_ancho = _alto = 0;
    _tamSector = 0;
	_matriz = NULL;
	}
    
Rejilla::Rejilla(const Rejilla &copia){
    _ancho = copia._ancho;
    _alto = copia._alto;
    _tamSector = copia._tamSector;
    
    _matriz = new int*[_alto];
    for(int i=0; i<_alto; i++)
        _matriz[i] = new int[_ancho];
    
    for(int i = 0; i<_alto; i++)
        for(int j=0; j<_ancho; j++)
            _matriz[i][j] = copia._matriz[i][j];
    }
    
Rejilla::Rejilla(unsigned int filas,unsigned int columnas, unsigned int tamSector){
    _ancho = columnas;
    _alto = filas;
    _tamSector = tamSector;
    
    _matriz = new int*[_alto];
    for(int i=0; i<_alto; i++)
        _matriz[i] = new int[_ancho];
    
    for(int i = 0; i<_alto; i++)
        for(int j = 0; j<_ancho; j++)
            _matriz[i][j] = 0;
    }
    
Rejilla::Rejilla(unsigned int filas,unsigned int columnas, unsigned int tamSector, int** matriz){
    _ancho = columnas;
    _alto = filas;
    _tamSector = tamSector;
    
    _matriz = new int*[_alto];
    for(int i=0; i<_alto; i++)
        _matriz[i] = new int[_ancho];
    
    for(int i = 0; i<_alto; i++)
        for(int j = 0; j<_ancho; j++)
            _matriz[i][j] = matriz[i][j];
    }
	
Rejilla::Rejilla(string filename, unsigned int tamSector){
	fstream pfichero;
	
	pfichero.open(filename.c_str(), ios::in);
	
	pfichero >> _ancho >> _alto;
	//pfichero.read(reinterpret_cast<char *>(&_ancho),sizeof(int));
    	//pfichero.read(reinterpret_cast<char *>(&_alto),sizeof(int));
    
    _tamSector = tamSector;

	_matriz = new int*[_alto];
	for(int i=0; i<_alto; i++){
		_matriz[i] = new int[_ancho];
		}
	
	for(int i = 0; i<_alto; i++)
		for(int j=0; j<_ancho; j++)
			pfichero >> _matriz[i][j];
    
//    	pfichero.read(reinterpret_cast<char *>(_matriz[0]),sizeof(unsigned int)*_ancho*_alto); 
    
    	pfichero.close();
	}

int Rejilla::mapearRejilla(Rejilla &R, int x, int y){

	if (	(int)(R.getAncho()/2)+x >= _ancho 	|| 
			(int)(R.getAlto()/2)+y >= _alto		||
			y < (int)(R.getAlto()/2)			||
			x < (int)(R.getAncho()/2)){
		return 0;
	}

	for(int i=-1; i<=1; i++){
		for(int j=-1; j<=1; j++){
			_matriz[x+i][y+j]=R.getElemento(i+(int)R.getAncho()/2,j+(int)R.getAlto()/2);
			}
		}
	
	return 1;
	}
	
int Rejilla::getAncho(){
	return _ancho;
	}
	
int Rejilla::getAlto(){
	return _alto;
	}

int Rejilla::getTamSector(){
    return _tamSector;
    }
    
int* Rejilla::getMatriz(){    
    int *matriz = new int[_alto*_ancho];

    for(int i = 0; i<_alto; i++)
        for(int j = 0; j<_ancho; j++)
            matriz[i*_alto+j] = _matriz[i][j];
            
    return matriz;
    }

int Rejilla::getElemento(unsigned int x,unsigned int y){
    return _matriz[x][y];
    }

void Rejilla::setElemento(unsigned int x,unsigned int y,int elemento){
    _matriz[x][y] = elemento;
    }

int Rejilla::flipElemento(unsigned int x, unsigned int y){
	
	if(_matriz[x][y])
		_matriz[x][y] = 0;
	else
		_matriz[x][y] = 1;
	
	return _matriz[x][y];
	}

Rejilla* Rejilla::particiones(int &partes){
    int filas,columnas;
    div_t filas_t,columnas_t;

    filas_t = div(_alto,(int)_tamSector);
    columnas_t = div(_ancho,(int)_tamSector);
    
    filas = filas_t.quot;
    columnas = columnas_t.quot;
    
    if(filas_t.rem) filas++;
    if(columnas_t.rem) columnas++;
    
    Rejilla *vector = new Rejilla[filas*columnas];
    
    partes = filas*columnas;
    
    for(int i = 0; i < filas; i++){
        for(int j = 0; j < columnas; j++){
            //vector[(i*filas)+j] = sector(i*3,j*3,3);
            vector[(i*columnas)+j] = sector(i*_tamSector,j*_tamSector,_tamSector);
            
            /*cout << "Sector: " << (i*columnas)+j << endl;
            vector[(i*columnas)+j].drawan();*/
            }
        }
    
    return vector;
    }
    
Rejilla Rejilla::sector(unsigned int x, unsigned int y, unsigned int tamano){
    Rejilla sector(tamano,tamano,_tamSector);
    
    for(int i = 0; i < tamano; i++){
        for(int j = 0; j < tamano; j++){
            if(x+i >= _alto || y+j >= _ancho) sector.setElemento(i,j,0);
            else                              sector.setElemento(i,j,_matriz[x+i][y+j]);
            }
        }
        
    return sector;
    }

void Rejilla::drawan(){
	for(int i = 0; i<_alto; i++){
		for(int j = 0; j<_ancho; j++){
			cout << _matriz[i][j] << " ";
			}
		cout << endl;
		}
	}

int Rejilla::numPartesAlto(){
    int filas;
    div_t filas_t;
    
    filas_t = div(_alto,(int)_tamSector);
    
    filas = filas_t.quot;
    
    if(filas_t.rem) filas++;
    
    return filas;
    }
    
int Rejilla::numPartesAncho(){
    int columnas;
    div_t columnas_t;
    
    columnas_t = div(_ancho,(int)_tamSector);
    
    columnas = columnas_t.quot;
    
    if(columnas_t.rem) columnas++;
    
    return columnas;
    }
    
void Rejilla::setSector(unsigned int fila, unsigned int columna, int* matriz){
    for(int i = 0; i < _tamSector; i++){
        for(int j = 0; j < _tamSector; j++){
            _matriz[fila+i][columna+j] = matriz[(i*_tamSector)+j];
            }
        }
    }

void Rejilla::volcar(string filename){
	ofstream pfichero;
	
	pfichero.open(filename.c_str(), ios::trunc);

	pfichero << _ancho << endl << _alto << endl;
    
	for(int i = 0; i<_alto; i++){
		for(int j=0; j<_ancho; j++){
			pfichero << _matriz[i][j] << " ";
			}
		pfichero << endl;
		}
     
   	pfichero.close();
	}

void Rejilla::invertir(){
	
	for(int i=0; i<_alto; i++)
		for(int j=0; j<_ancho; j++)
			flipElemento(i,j);
	}

void Rejilla::ponerTodo(int valor){
	
	for(int i=0; i<_alto; i++)
		for(int j=0; j<_ancho; j++)
			_matriz[i][j]=valor;

	}

void Rejilla::aleatoria(){
	
	for(int i=0; i<_alto; i++)
		for(int j=0; j<_ancho; j++)
			_matriz[i][j] = rand()%2;

	}

